package consultas;

import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.hibernate.Query;
import org.hibernate.Session;

import Partido.PartidoSimple;
import equipos.Equipo;

/**
 * TODO: description
 */
public class HistorialPSimples {
    public int victoriasEnTotal(final Session s, final Equipo equipo) {
        Query q = s.createQuery("from PartidoSimple p where (p.equipo1 = :variable) or (p.equipo2 = :variable)");

        q.setParameter("variable", equipo);
        List<PartidoSimple> partidosSimples = q.list();
        int resultado = 0;

        for (PartidoSimple ps : partidosSimples) {
            if (ps.getEquipoGanador() != null && equipo.equals(ps.getEquipoGanador())) {
                resultado++;
            }
        }

        return resultado;
    }

    public Map<Equipo, Integer> equiposConVictorias(final List<Equipo> equipos, final Session session) {

        Map<Equipo, Integer> map = new Hashtable<Equipo, Integer>();
        for (Equipo equipo : equipos) {
            map.put(equipo, this.victoriasEnTotal(session, equipo));
        }
        return map;
    }

    public Equipo obtenerEquipoConMasVictorias(final Map<Equipo, Integer> map) {
        Equipo equipoConMasVictorias = null;
        int max = 0;

        for (Equipo e : map.keySet()) {
            if (map.get(e) >= max) {
                equipoConMasVictorias = e;
                max = map.get(e);
            }
        }
        map.remove(equipoConMasVictorias);
        return equipoConMasVictorias;
    }

    // retorna una lista de equipos ordenada por mayor cantidad de victorias en total
    public List<Equipo> obtenerLista(final Session session, final List<Equipo> equipos) {
        Map<Equipo, Integer> map = this.equiposConVictorias(equipos, session);
        int cantEquipos = equipos.size();

        List<Equipo> equiposOrdenados = new Vector<Equipo>();

        while (cantEquipos > 0) {
            equiposOrdenados.add(this.obtenerEquipoConMasVictorias(map));
            cantEquipos--;
        }
        return equiposOrdenados;
    }

    // retorna una lista de equipos ordenada por menor cantidad de victorias en total
    public List<Equipo> obtenerLista2(final Session session, final List<Equipo> equipos) {

        List<Equipo> lista = this.obtenerLista(session, equipos);
        Collections.reverse(lista);

        return lista;
    }

    // ALTERNATIVA

    public List<PartidoSimple> obtenerTodosLosPartidosSimples(final Session session) {
        Query q = session.createQuery("from PartidoSimple");
        return q.list();
    }

    public List<Equipo> obtenerEquiposGanadoresPartidoSimpleConRepetidos(final Session session) {
        Query q = session.createQuery("select p.equipoGanador from PartidoSimple p where p.equipoGanador <> null");
        return q.list();
    }

    public int cantidadDeVictoriasDeEquipo(final Equipo equipo, final List<PartidoSimple> partidosSimples) {
        int victorias = 0;
        for (PartidoSimple partidoSimple : partidosSimples) {
            if (partidoSimple.getEquipoGanador() != null && partidoSimple.getEquipoGanador().equals(equipo)) {
                victorias++;
            }
        }
        return victorias;
    }

    public Map<Equipo, Integer> equiposConVictorias2(final Session session, final List<Equipo> equipos) {

        List<PartidoSimple> partidosSimples = this.obtenerTodosLosPartidosSimples(session);

        Map<Equipo, Integer> map = new Hashtable<Equipo, Integer>();

        for (Equipo equipo : equipos) {
            map.put(equipo, this.cantidadDeVictoriasDeEquipo(equipo, partidosSimples));
        }

        return map;
    }

    // ALTERNATIVA A equiposConVictorias2
    public Map<Equipo, Integer> equiposGanadores(final Session session, final List<Equipo> equipos) {

        List<Equipo> listaDeEquipos = this.obtenerEquiposGanadoresPartidoSimpleConRepetidos(session);

        Map<Equipo, Integer> map = new Hashtable<Equipo, Integer>();

        int contador = 0;

        for (Equipo equipo : equipos) {
            for (Equipo ganador : listaDeEquipos) {
                if (equipo.equals(ganador)) {
                    contador++;
                }
            }
            map.put(equipo, contador);
            contador = 0;
        }

        return map;
    }

    public List<Equipo> obtenerLista3(final Session session, final List<Equipo> equipos) {
        // Map<Equipo, Integer> map = this.equiposConVictorias2(session, equipos);
        Map<Equipo, Integer> map = this.equiposGanadores(session, equipos);
        int cantEquipos = equipos.size();

        List<Equipo> equiposOrdenados = new Vector<Equipo>();

        while (cantEquipos > 0) {
            equiposOrdenados.add(this.obtenerEquipoConMasVictorias(map));
            cantEquipos--;
        }
        return equiposOrdenados;
    }

    public List<Equipo> obtenerLista4(final Session session, final List<Equipo> equipos) {

        List<Equipo> lista = this.obtenerLista3(session, equipos);
        Collections.reverse(lista);

        return lista;
    }

}
